package cn.edu.ncu.housinghub.service;

import cn.edu.ncu.housinghub.dto.request.user.ChangePasswordRequest;
import cn.edu.ncu.housinghub.dto.request.user.RegisterRequest;
import cn.edu.ncu.housinghub.dto.request.user.UserProfileRequest;
import cn.edu.ncu.housinghub.dto.response.user.UserProfileResponse;
import cn.edu.ncu.housinghub.entity.user.Agent;
import cn.edu.ncu.housinghub.entity.user.Landlord;
import cn.edu.ncu.housinghub.entity.user.User;
import cn.edu.ncu.housinghub.vo.Result;
import jakarta.validation.constraints.NotNull;

/**
 * 用户业务
 */
public interface UserService {
    /**
     * 根据邮箱和密码验证用户
     * @param email 邮箱
     * @param password 密码
     * @return 用户信息或null
     */
    User authenticate(String email, String password);

    /**
     * 根据邮箱查找用户
     * @param email 邮箱
     * @return 用户信息或null
     */
    User findByEmail(String email);

    /**
     * 保存用户
     * @param registerRequest 注册请求参数
     * @return 保存后的用户信息
     */
    User save(RegisterRequest registerRequest);


    /**
     * 注销用户
     * @param info 用户token
     */
    void logout(String info);

    /**
     * 获取用户token,将用户信息保存到Redis中并将token返回给前端（map（info：uuid,loginUser:user））
     * @param user 用户信息
     * @return token
     */
    Result getToken(User user);

    /**
     * 实名认证
     * @param user 用户信息
     * @param realName 真实姓名
     * @param identityCard 身份证号
     * @return 认证结果
     */
    Result verifyIdentity(User user, String realName, String identityCard);

    /**
     * 根据token获取用户信息
     * @param token 用户token
     * @return 用户信息
     */
    User getUserByToken(String token);

    /**
     * 根据id查找用户
     * @param id 用户id
     * @return 用户信息
     */
    User findById(Long id);

    /**
     * 修改用户角色为房东
     * @param userId 用户id
     */
    void modifyUserRoleToLandlord(Long userId);

    /**
     * 添加新房东
     * @param landlord 新房东信息
     */
    void addNewLandlord(Landlord landlord);

    /**
     * 根据用户id查找房东信息
     * @param userId 用户id
    **/
    Landlord findLandlordByUserId(Long userId);


    /**
     * 修改角色为中介
     * @param userId
     */
    void modifyUserRoleToAgent(Long userId);

    /**
     * 添加新中介
     * @param agent 新中介信息
     */
    void addNewAgent(Agent agent);

    /**
     * 根据用户id查找中介信息
     * @param userId 用户id
     */
    Agent findAgentByUserID(@NotNull(message = "用户ID不能为空") Long userId);

    /**
     * 获取用户个人资料
     * @param token 用户token
     * @return 用户个人资料
     */
    UserProfileResponse getUserProfile(String token);

    /**
     * 更新用户个人资料
     * @param token 用户token
     * @param profileRequest 个人资料更新请求
     * @return 更新结果
     */
    Result updateUserProfile(String token, UserProfileRequest profileRequest);

    /**
     * 修改用户密码
     * @param token 用户token
     * @param changePasswordRequest 修改密码请求
     * @return 修改结果
     */
    Result changePassword(String token, ChangePasswordRequest changePasswordRequest);
}
